package com.chao.common.codeGeneration.source;

import com.chao.common.codeGeneration.bean.Table;
import com.chao.common.codeGeneration.bean.TableColumns;
import com.chao.common.codeGeneration.generation.FileUtile;
import com.chao.common.codeGeneration.generation.Generation;
import com.chao.common.util.DateUtile;
import com.chao.common.util.exception.SysException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;

public class ToService {

    public static void toService(Table table, String path){
        File file = FileUtile.createFile(path+"\\service\\"+table.getPojoKey()+"Service.java");
        try(Writer out =new FileWriter(file)) {
            String servicePag = table.getService();
            List<String> fun = Arrays.asList(table.getFunction());
            StringBuilder sb = new StringBuilder();
            // package
            sb.append("package com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".service;").append("\r\n\r\n");

            //import
            sb.append("import com.alibaba.fastjson.JSONObject;").append("\r\n");
            sb.append("import com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".bean.").append(table.getPojoKey()).append(";").append("\r\n");
            if(fun.contains("批量新增")){
                sb.append("import java.util.List;").append("\r\n");
            }
            if(fun.contains("分页查询") || fun.contains("查询列表")){
                sb.append("import com.chao.common.util.reaction.PageList;").append("\r\n");
            }


            //Class
            sb.append("\r\n").append("\r\n");
            sb.append("/**").append("\r\n");
            sb.append(" * ").append(table.getPojoName()).append("Service").append("\r\n");
            sb.append(" * ").append(Generation.author).append("\r\n");
            sb.append(" * ").append(DateUtile.toYmd()).append("\r\n");
            sb.append(" */").append("\r\n");
            sb.append("public interface ").append(table.getPojoKey()).append("Service {").append("\r\n");

            //函数
            //获取主键
            TableColumns col = null;
            for(TableColumns column: table.getColumns()){
                if(column.getKey()){
                    col = column;
                }
            }
            if(col == null){
                throw new SysException("数据表未设置主键!");
            }
            if(fun.contains("新增")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 新增").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tvoid insert").append(table.getPojoKey()).append("(").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append(");").append("\r\n");
            }

            if(fun.contains("批量新增")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 批量新增").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tvoid insertAll").append(table.getPojoKey()).append("(List<").append(table.getPojoKey()).append("> ").append(table.getUpojoKey()).append("List);").append("\r\n");
            }

            if(fun.contains("修改")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 修改").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tvoid update").append(table.getPojoKey()).append("(").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append(");").append("\r\n");
            }

            if(fun.contains("逻辑删除")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 删除").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tvoid delete").append(table.getPojoKey()).append("(String ").append(col.getLowercaseName()).append(");").append("\r\n");
            }

            if(fun.contains("物理删除")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 物理删除").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tvoid deleteData").append(table.getPojoKey()).append("(String ").append(col.getLowercaseName()).append(");").append("\r\n");
            }

            if(fun.contains("查询详情")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 查询").append(table.getPojoName()).append("详情").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t").append(table.getPojoKey()).append(" select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(String ").append(col.getLowercaseName()).append(");").append("\r\n");
            }

            if(fun.contains("查询列表")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 查询").append(table.getPojoName()).append("列表").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tPageList<").append(table.getPojoKey()).append("> select").append(table.getPojoKey()).append("ByList(JSONObject json);").append("\r\n");
            }

            if(fun.contains("分页查询")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 分页查询").append(table.getPojoName()).append("列表").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\tPageList<").append(table.getPojoKey()).append("> select").append(table.getPojoKey()).append("ByPage(JSONObject json);").append("\r\n");
            }
            sb.append("\r\n");
            sb.append("}");
            out.write(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        toServiceImpl(table,path);
    }

    public static void toServiceImpl(Table table, String path){
        File file = FileUtile.createFile(path+"\\service\\impl\\"+table.getPojoKey()+"ServiceImpl.java");
        try(Writer out =new FileWriter(file)) {
            String servicePag = table.getService();
            List<String> fun = Arrays.asList(table.getFunction());
            StringBuilder sb = new StringBuilder();

            //判断是否有修改时间字段
            boolean isUtime = false;
            //判断是否有新增时间字段
            boolean isCtime = false;
            //判断是否有创建人字段
            boolean isCreateUserId = false;
            for(TableColumns column: table.getColumns()){
                if("utime".equals(column.getColumnName())){
                    isUtime = true;
                }
                if("ctime".equals(column.getColumnName())){
                    isCtime = true;
                }
                if("create_user_id".equals(column.getColumnName())){
                    isCreateUserId = true;
                }
            }
            // package
            sb.append("package com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".service.impl;").append("\r\n\r\n");

            //import
            sb.append("import com.alibaba.fastjson.JSONObject;").append("\r\n");
            if(isCreateUserId){
                sb.append("import com.chao.common.util.RequestUtile;").append("\r\n");
            }
            sb.append("import com.chao.common.util.StrUtile;").append("\r\n");
            if(fun.contains("附件")) {
                sb.append("import com.chao.common.util.file.SysFile;").append("\r\n");
            }
            sb.append("import com.chao.common.util.exception.SysException;").append("\r\n");
            sb.append("import com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".bean.").append(table.getPojoKey()).append(";").append("\r\n");
            sb.append("import com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".mapper.").append(table.getPojoKey()).append("Mapper;").append("\r\n");
            sb.append("import com.chao.").append(servicePag).append(".modular.").append(table.getPacName()).append(".service.").append(table.getPojoKey()).append("Service;").append("\r\n");
            sb.append("import org.springframework.beans.factory.annotation.Autowired;").append("\r\n");
            sb.append("import org.springframework.stereotype.Service;").append("\r\n");
            sb.append("import org.springframework.transaction.annotation.Transactional;").append("\r\n");


            if(fun.contains("分页查询") || fun.contains("查询列表")){
                sb.append("import com.chao.common.util.reaction.PageList;").append("\r\n");
            }
            if(isUtime || isCtime){
                sb.append("import java.util.Date;").append("\r\n");
            }
            if(fun.contains("批量新增")){
                sb.append("import java.util.List;").append("\r\n");
            }


            //Class
            sb.append("\r\n").append("\r\n");
            sb.append("/**").append("\r\n");
            sb.append(" * ").append(table.getPojoName()).append("ServiceImpl").append("\r\n");
            sb.append(" * ").append(Generation.author).append("\r\n");
            sb.append(" * ").append(DateUtile.toYmd()).append("\r\n");
            sb.append(" */").append("\r\n");
            sb.append("@Service").append("\r\n");
            sb.append("public class ").append(table.getPojoKey()).append("ServiceImpl implements ").append(table.getPojoKey()).append("Service {").append("\r\n");

            //service
            sb.append("\r\n");
            sb.append("\t/**").append("\r\n");
            sb.append("\t * ").append(table.getPojoName()).append("Mapper").append("\r\n");
            sb.append("\t */").append("\r\n");
            sb.append("\t@Autowired").append("\r\n");
            sb.append("\tprivate ").append(table.getPojoKey()).append("Mapper ").append(table.getUpojoKey()).append("Mapper;").append("\r\n");

            //函数

            //获取主键
            TableColumns col = null;
            for(TableColumns column: table.getColumns()){
                if(column.getKey()){
                    col = column;
                }
            }
            if(col == null){
                throw new SysException("数据表未设置主键!");
            }
            if(fun.contains("新增")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 新增").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\t@Transactional").append("\r\n");
                sb.append("\tpublic void insert").append(table.getPojoKey()).append("(").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append("){").append("\r\n");
                sb.append("\t\t").append(table.getUpojoKey()).append(".set").append(col.getCapitalLetterName()).append("(StrUtile.getId());").append("\r\n");
                if(isCtime){
                    sb.append("\t\t").append(table.getUpojoKey()).append(".setCtime(new Date());").append("\r\n");
                }
                if(isCreateUserId) {
                    sb.append("\t\t").append(table.getUpojoKey()).append(".setCreateUserId(RequestUtile.getLoginUserId());").append("\r\n");
                }
                sb.append("\t\t").append(table.getUpojoKey()).append("Mapper.insert").append(table.getPojoKey()).append("(").append(table.getUpojoKey()).append(");").append("\r\n");
                if(fun.contains("附件")) {
                    sb.append("\r\n\r\n\t\t").append("SysFile.insertResourceList(").append(table.getUpojoKey()).append(".getFileList(),").append(table.getUpojoKey()).append(".get").append(col.getCapitalLetterName()).append("());").append("\r\n");
                }
                sb.append("\t}").append("\r\n");
            }

            if(fun.contains("批量新增")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 批量新增").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\t@Transactional").append("\r\n");
                sb.append("\tpublic void insertAll").append(table.getPojoKey()).append("(List<").append(table.getPojoKey()).append("> ").append(table.getUpojoKey()).append("List){").append("\r\n");
                if(isCtime || isCreateUserId){
                    sb.append("\t\t").append(table.getUpojoKey()).append("List.forEach(").append(table.getUpojoKey()).append(" -> {").append("\r\n");
                    sb.append("\t\t\t").append(table.getUpojoKey()).append(".set").append(col.getCapitalLetterName()).append("(StrUtile.getId());").append("\r\n");
                    if(isCtime){
                        sb.append("\t\t\t").append(table.getUpojoKey()).append(".setCtime(new Date());").append("\r\n");
                    }
                    if(isCreateUserId) {
                        sb.append("\t\t\t").append(table.getUpojoKey()).append(".setCreateUserId(RequestUtile.getLoginUserId());").append("\r\n");
                    }
                    sb.append("\t\t});").append("\r\n");
                }else{
                    sb.append("\t\t").append(table.getUpojoKey()).append("List.forEach(").append(table.getUpojoKey()).append(" -> ").append(table.getUpojoKey()).append(".set").append(col.getCapitalLetterName()).append("(StrUtile.getId()));").append("\r\n");
                }
                sb.append("\t\t").append(table.getUpojoKey()).append("Mapper.insertAll").append(table.getPojoKey()).append("(").append(table.getUpojoKey()).append("List);").append("\r\n");
                sb.append("\t}").append("\r\n");
            }

            if(fun.contains("修改")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 修改").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\t@Transactional").append("\r\n");
                sb.append("\tpublic void update").append(table.getPojoKey()).append("(").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append("){").append("\r\n");
                if(fun.contains("查询详情")) {
                    sb.append("\t\t").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append("Pojo = ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(").append(table.getUpojoKey()).append(".get").append(col.getCapitalLetterName()).append("());").append("\r\n");
                    sb.append("\t\tif(null == ").append(table.getUpojoKey()).append("Pojo){").append("\r\n");
                    sb.append("\t\t    throw new SysException(\"修改").append(table.getPojoName()).append("失败:记录不存在!\");").append("\r\n");
                    sb.append("\t\t}").append("\r\n");
                }
                if(isUtime){
                    sb.append("\t\t").append(table.getUpojoKey()).append(".setUtime(new Date());").append("\r\n");
                }
                sb.append("\t\t").append(table.getUpojoKey()).append("Mapper.update").append(table.getPojoKey()).append("(").append(table.getUpojoKey()).append(");").append("\r\n");
                if(fun.contains("附件")) {
                    sb.append("\r\n\r\n\t\t").append("SysFile.deleteResourceByRelationId(").append(table.getUpojoKey()).append(".get").append(col.getCapitalLetterName()).append("());").append("\r\n");
                    sb.append("\t\t").append("SysFile.insertResourceList(").append(table.getUpojoKey()).append(".getFileList(),").append(table.getUpojoKey()).append(".get").append(col.getCapitalLetterName()).append("());").append("\r\n");
                }
                sb.append("\t}").append("\r\n");
            }

            if(fun.contains("逻辑删除")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 删除").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\t@Transactional").append("\r\n");
                sb.append("\tpublic void delete").append(table.getPojoKey()).append("(String ").append(col.getLowercaseName()).append("){").append("\r\n");
                if(fun.contains("查询详情")) {
                    sb.append("\t\t").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append(" = ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
                    sb.append("\t\tif(null == ").append(table.getUpojoKey()).append("){").append("\r\n");
                    sb.append("\t\t    throw new SysException(\"删除").append(table.getPojoName()).append("失败:记录不存在!\");").append("\r\n");
                    sb.append("\t\t}").append("\r\n");
                }
                sb.append("\t\t").append(table.getUpojoKey()).append("Mapper.delete").append(table.getPojoKey()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
                sb.append("\t}").append("\r\n");
            }

            if(fun.contains("物理删除")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 物理删除").append(table.getPojoName()).append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\t@Transactional").append("\r\n");
                sb.append("\tpublic void deleteData").append(table.getPojoKey()).append("(String ").append(col.getLowercaseName()).append("){").append("\r\n");
                if(fun.contains("查询详情")) {
                    sb.append("\t\t").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append(" = ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
                    sb.append("\t\tif(null == ").append(table.getUpojoKey()).append("){").append("\r\n");
                    sb.append("\t\t    throw new SysException(\"删除").append(table.getPojoName()).append("失败:记录不存在!\");").append("\r\n");
                    sb.append("\t\t}").append("\r\n");
                }
                sb.append("\t\t").append(table.getUpojoKey()).append("Mapper.deleteData").append(table.getPojoKey()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
                sb.append("\t}").append("\r\n");
            }

            if(fun.contains("查询详情")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 查询").append(table.getPojoName()).append("详情").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\tpublic ").append(table.getPojoKey()).append(" select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(String ").append(col.getLowercaseName()).append("){").append("\r\n");
                if(fun.contains("附件")){
                    sb.append("\t\t").append(table.getPojoKey()).append(" ").append(table.getUpojoKey()).append(" = ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
                    sb.append("\t\t").append(table.getUpojoKey()).append(".setFileList(SysFile.getRelationList(").append(table.getUpojoKey()).append(".get").append(col.getCapitalLetterName()).append("()));\r\n");
                    sb.append("\t\treturn ").append(table.getUpojoKey()).append(";\r\n");
                }else {
                    sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("By").append(col.getCapitalLetterName()).append("(").append(col.getLowercaseName()).append(");").append("\r\n");
                }
                sb.append("\t}").append("\r\n");
            }

            if(fun.contains("查询列表")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 查询").append(table.getPojoName()).append("列表").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\tpublic PageList<").append(table.getPojoKey()).append("> select").append(table.getPojoKey()).append("ByList(JSONObject json){").append("\r\n");
                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("ByList(json);").append("\r\n");
                sb.append("\t}").append("\r\n");
            }

            if(fun.contains("分页查询")){
                sb.append("\r\n");
                sb.append("\t/**").append("\r\n");
                sb.append("\t * 分页查询").append(table.getPojoName()).append("列表").append("\r\n");
                sb.append("\t */").append("\r\n");
                sb.append("\t@Override").append("\r\n");
                sb.append("\tpublic PageList<").append(table.getPojoKey()).append("> select").append(table.getPojoKey()).append("ByPage(JSONObject json){").append("\r\n");
                sb.append("\t\treturn ").append(table.getUpojoKey()).append("Mapper.select").append(table.getPojoKey()).append("ByList(StrUtile.getPageJson(json));").append("\r\n");
                sb.append("\t}").append("\r\n");
            }
            sb.append("\r\n");
            sb.append("}");
            out.write(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}